package dletc.lock;

/*
 * 多线程产生的问题：错误数据
 * 原因：当一个线程操作的时候，还没来得及结束，另一个线程也参与进来了，导致了同时修改了同一个数据。
 * 线程安全问题的三个必要条件：
 * 条件1： 多线程并发
 * 条件2： 有共享数据
 * 条件3： 共享数据有被修改的行为
 * */
public class unsafeThread {

    public static void main(String[] args) {
        BuyTicket buyTicket = new BuyTicket();
        new Thread(buyTicket, "A").start();
        new Thread(buyTicket, "B").start();
        new Thread(buyTicket, "C").start();
    }
}

class BuyTicket implements Runnable {

    private int ticket = 10; //共有数据  这个虽然是实例变量，但只new了一个对象。
    private boolean flag = true; //配置线程结束开关

    @Override
    public void run() {
        while (flag) {
            try {
                buy();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    //购买车票
    //添加 synchronized 关键字 变为线程同步 synchronized 关键字的lock为this 当前对象
    public synchronized void buy() throws InterruptedException {
        if (ticket <= 0) { //判断是否有票
            flag = false;
            return;
        }
        Thread.sleep(100);
        System.out.println(Thread.currentThread().getName() + "买到第" + ticket-- + "票");
    }
}


